package com.shujia.code_block;

//import java.lang.String; 可以省略

public class Person {

    private String name;
    public static String country;

    /*
    非静态代码块
    1. 可以有输出语句。
    2. 可以对类的属性进行初始化操作。
    3. 除了调用非静态变量、方法外，还可以调用静态的变量或方法。
    4. 若有多个非静态的代码块，那么按照从上到下的顺序依次执行。
    5. 每次创建对象的时候，都会执行一次。且先于构造器执行。
     */
    {
        System.out.println("非静态代码块1 -- start");
//        name = "张伟";
//        System.out.println(this.name);
//        this.eat();
//        System.out.println(Person.class);
//        System.out.println(Person.country);
//        Person.play();
        System.out.println("非静态代码块1 -- end");
    }

    {
        System.out.println("非静态代码块2 -- start");
        System.out.println("非静态代码块2 -- end");
    }

    public Person() {
        System.out.println("Person 无参构造方法...");
    }

    /*
    静态代码块
    1. 可以有输出语句。
    2. 可以对类的属性进行初始化操作。
    3. 不可以对非静态的属性初始化。即：不可以调用非静态的属性和方法。
    4. 若有多个静态的代码块，那么按照从上到下的顺序依次执行。
    5. 静态代码块的执行要先于非静态代码块。
    6. 静态代码块随着类的加载而加载，且只执行一次。
     */
    static {
        System.out.println("静态代码块1...");
        // System.out.println(this);
//        System.out.println(Person.country);
    }

    static {
        System.out.println("静态代码块2...");
        // System.out.println(this);
//        System.out.println(Person.country);
    }


    // 类方法(静态方法)
    public static void play() {
        System.out.println(country);
        System.out.println("static play...");
    }

    public void eat() {
        System.out.println(this);
        System.out.println("eat....");
    }


    public static void main(String[] args) {
        // 局部代码块
        for (int i = 0; i < 100; i++) {
            System.out.println(i);
        }

        {
            int a = 10;
            int b = 20;
            System.out.println(a);
            System.out.println(b);
        }

        // System.out.println(a);// 超出了使用范围

        // System.out.println(i);
    }

}
